package com.easypan.util;

import com.easypan.enums.DateTimePatternEnum;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class DateUtil {

    private static final Object lockObj = new Object();
    private static Map<String, ThreadLocal<SimpleDateFormat>> sdfMap = new HashMap<String, ThreadLocal<SimpleDateFormat>>();

    private static SimpleDateFormat getSdf(final String pattern) {
        ThreadLocal<SimpleDateFormat> tl = sdfMap.get(pattern);
        if (tl == null) {
            synchronized (lockObj) {
                tl = sdfMap.get(pattern);
                if (tl == null) {
                    tl = new ThreadLocal<SimpleDateFormat>() {
                        @Override
                        protected SimpleDateFormat initialValue() {
                            return new SimpleDateFormat(pattern);
                        }
                    };
                    sdfMap.put(pattern, tl);
                }
            }
        }

        return tl.get();
    }

    public static String format(Date date, String pattern) {
        return getSdf(pattern).format(date);
    }

    public static Date parse(String dateStr, String pattern) {
        try {
            return getSdf(pattern).parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return new Date();
    }


    /**
     * 1. 首先，使用反射机制获取 `Calendar` 类的实例对象。`Calendar` 是 Java 提供的一个用于处理日期和时间的类。
     * 2. 接下来，使用 `calendar.add(Calendar.DAY_OF_YEAR, day)` 方法将 `calendar` 对象的日期增加 `day` 天。
     * 这里使用 `Calendar.DAY_OF_YEAR` 表示增加的是年中的天数。
     *
     * 3. 最后，通过 `calendar.getTime()` 方法将 `calendar` 对象转换为 `Date` 类型，并返回该日期对象。
     * 总的来说，该方法的目的是根据给定的整数参数 `day`，获取当前日期之后 `day` 天的日期。
     * 例如，如果传入参数 `day` 为 3，则返回当前日期之后的第三天的日期。
     * @param day
     * @return
     */
    public static Date getAfterDate(Integer day) {
        //反射机制获取Calendar实例对象
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_YEAR, day);
        return calendar.getTime();
    }

    public static void main(String[] args) {
        System.out.println(format(getAfterDate(1), DateTimePatternEnum.YYYY_MM_DD_HH_MM_SS.getPattern()));
    }
}
